package com.legal.config;

import com.legal.filter.JwtAuthenticationTokenFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;


// 配置类，用于配置Spring Security
//@Configuration
//@EnableWebSecurity // 启用Spring Security
public class SecurityConfigBefore {

    // 创建并返回一个PasswordEncoder实例，用于密码编码
    @Bean
    public PasswordEncoder passwordEncoder(){
        // 使用BCrypt算法进行密码编码
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(AbstractHttpConfigurer::disable) // 关闭 CSRF（如果是 API 服务）
            .authorizeHttpRequests(auth -> auth
                 /*
                 permitAll 和 authenticated 核心区别对比表：
                        特性	.permitAll()	.authenticated()
                        认证要求	完全不需要认证	必须携带有效认证信息（如 JWT）
                        权限检查	跳过所有权限检查	仍会执行权限检查（如 @PreAuthorize）
                        过滤器执行	仍然会经过所有过滤器	必须通过过滤器认证
                        适用场景	登录接口/公开资源	需要登录但无需特定角色的接口
                        安全性	低（完全开放）	中（需认证但不限角色）
                  */
                 // permitAll(): 确保这些路径不需要任何权限即可访问（跳过 AuthorizationManager 检查）。
                .requestMatchers("/user/login").permitAll() // 登录接口，跳过所有权限检查,仍然会经过所有过滤器
                .requestMatchers("/user/register").permitAll() // 注册接口
                .requestMatchers("/captcha/**").permitAll() // 验证码接口
                .requestMatchers(
                        "/swagger-ui/**",
                        "/v3/api-docs/**",
                        "/webjars/**",
                        "/swagger-resources/**",
                        "/doc.html",
                        "/favicon.ico"
                ).permitAll() // 放行 Swagger
               .requestMatchers("/ai/chat/stream").permitAll() // 跳过所有权限检查,仍然会经过所有过滤器
               .requestMatchers("/ai/analysis/chat").permitAll() // 跳过所有权限检查,仍然会经过所有过滤器
               .requestMatchers("/ai/media/test").permitAll() // 跳过所有权限检查,仍然会经过所有过滤器
                //.requestMatchers("/ai/chat/stream").authenticated() // 需要身份认证

                /* 关于接口/ai/chat/stream的访问权限问题：
                    流式接口 /ai/chat/stream 必须使用 .permitAll() 才能工作，用 .authenticated() 会报错，
                    这通常是由流式响应特性与 Spring Security 的交互方式冲突导致的。

                    1.响应立即提交：Flux<String> 会立即开始发送数据，导致响应头被提前提交
                    2.权限检查滞后：Spring Security 的 @PreAuthorize 和 .authenticated() 在控制器方法执行时检查权限，此时响应已开始
                 */


                .anyRequest().authenticated() // 其他所有接口需要身份认证

            )
            // 添加 自定义的 JWT 过滤器（见下一步）
            // JwtAuthenticationFilter 是通过 .addFilterBefore() 手动添加的，属于过滤器链的一部分，所有请求都会经过它。
            .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);


        return http.build();
    }

    @Bean
    public JwtAuthenticationTokenFilter jwtAuthenticationFilter() {
        return new JwtAuthenticationTokenFilter();
    }

}
